package com.lost.octopus.es.processor.config.es.alias;

import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.data.repository.NoRepositoryBean;

/**
 * 具有别名处理功能的仓储
 * @author zhangbh
 * @date 2022/10/31 0031 16:19
 */
@NoRepositoryBean
public interface AliasElasticsearchRepository<T, ID> extends ElasticsearchRepository<T, ID> {


    /**
     * 保存，并指定存储的index
     * @param entities 实体
     * @param indexCoordinates 实体对应的名称列表
     * @param <S> 实体
     * @return 原本实体
     */
    <S extends T> Iterable<S> saveAll(Iterable<S> entities, IndexCoordinates indexCoordinates);


    /**
     * 删除，通过指定索引
     */
    void deleteAllById(Iterable<? extends ID> ids, IndexCoordinates indexCoordinates);

    /**
     * 获取当前索引对象
     */
    IndexCoordinates getIndexCoordinates();

    /**
     * 获取临时时间戳索引，传null则创建，否则使用name
     * @param name 指定临时索引名称
     * @return 别名
     */
    IndexCoordinates getTimestampAlias(String name);

    /**
     * 增加别名 其实就是把传入的索引，别名改为原本的名字
     * 如：将resident_1111 增加别名 resident
     * @param coordinates 时间戳索引
     */
    void addByOriginalAlias(IndexCoordinates coordinates);

    /**
     * 通过模板class创建索引，只是名称不同
     * 名字为时间戳，mapping配置以原有的class做模板
     * @param coordinates 时间戳索引
     * @return 是否成功
     */
    boolean createWithMapping(IndexCoordinates coordinates);

    /**
     * 把别名修改为xx_del
     * @return 是否是原始索引
     */
    EsAliasRemoveInfo removeAlias();

    /**
     * 索引名检查是否存在 别名也可搜索
     * @return 是否存在
     */
    boolean indexExists();

    /**
     * 删除索引
     * @return 是否成功
     */
    boolean deleteIndex();

    /**
     * 异步删除索引,因为异步情况，索引别名会变化
     * 直接传输实际名称
     */
    void deleteAsyncIndex(String indexName);
}
